package main

import (
	"fmt"
	"math/rand"
	"time"
)

func main() {
	multiplicationTab()
	randomNumber()
	fibonacci()
}

// 1、打印九九乘法表。如果可以要求间隔均匀
func multiplicationTab() {
	// 99乘法表正三角打印
	for i := 1; i < 10; i++ {
		for j := 1; j <= i; j++ {
			fmt.Printf("%d*%d=%-3d", j, i, i*j)
		}
		fmt.Println()
	}
	fmt.Println()

	// 99乘法表倒三角打印
	for i := 9; i > 0; i-- {
		for j := 1; j <= i; j++ {
			fmt.Printf("%d*%d=%-3d", j, i, i*j)
		}
		fmt.Println()
	}
	fmt.Println()
}

// 2.随机生成20以内的20个非0正整数，打印出来。对生成的数值，第单数个（不是索引）累加求和，第偶数个累乘求积并打印结果
func randomNumber() {
	// 以系统时间纳秒设置伪随机数生成器的种子
	r1 := rand.New(rand.NewSource(time.Now().UnixNano()))

	// 存放所有奇数和的变量，偶数乘积的变量声明及赋初始值。
	oddSum, evenProduct := 0, 1

	// 生成的随机数使用的切片定义
	var numbers []int

	// 随机生成20以内的20个非0正整数，打印出来
	for i := 1; i <= 20; i++ {

		// r1.Intn(19)函数生成的随机数的范围为[0,19),+1为确保生成的随机数不为0，即范围为[1,20)
		rnum := r1.Intn(19) + 1

		//将生成的随机数追加到切片中
		numbers = append(numbers, rnum)
	}
	fmt.Println("随机生成20以内的20个非0正整数为：")
	fmt.Println(numbers)
	for i, num := range numbers {
		//切片的索引以0及偶数索引指向的值为切片的第奇数个元素的值
		//切片的奇数索引指向的值为切片的第偶数个元素的值
		//通过对切片的索引以2取模判断奇偶，可以获取索引指向的切片的奇，偶元素的值
		if i%2 == 1 {
			evenProduct *= num
		} else {
			oddSum += num
		}
	}
	fmt.Printf("第单数个随机数累计求和值为: %d\n", oddSum)
	fmt.Printf("第偶数个随机数累计求积值为: %d\n", evenProduct)
	fmt.Println()
}

// 3.打印100以内的斐波那契数列
func fibonacci() {
	a, b := 0, 1
	fmt.Println("100以内的斐波那契数列为：")
	for a+b < 100 {
		a, b = b, a+b
		fmt.Printf("%d ", b)
	}
}
